package org.gorson.utils;

import java.math.BigDecimal;
import java.util.ArrayList;
import java.util.List;

/**
 * @discreption 常见类型互相转换，如:String、double等
 * @date 2019-05-08 01:57:28
 * 1、Object转为String类型：castString(Object obj)
 * 2、Object转为String类型（提供默认值）：castString(Object obj, String defaultValue)
 * 3、Object转为double类型：castDouble(Object obj)
 * 4、Object转为double类型（提供默认值）：castDouble(Object obj, double defaultValue)
 * 5、Object转为long型：castLong(Object obj)
 * 6、Object转为long型（提供默认数值）：castLong(Object obj, long defaultValue)
 * 7、Object转为int型：castInt(Object obj)
 * 8、Object转为int型(提供默认值)：castInt(Object obj, int defaultValue)
 * 9、Object转为boolean型：castBoolean(Object obj)
 * 10、Object转为boolean型（提供默认值）：castBoolean(Object obj, boolean defaultValue)
 */
public class CastUtil {

    //构造方法私有化
    private CastUtil() {
    }

    /**
     * @param obj 要转换的参数
     * @return String （如果参数为null则转为空字符串）
     * @Title: castString
     * @Description: Object转为String类型（实体类需要重写toString方法）
     * @date 2019-05-05 02:47:56
     */
    public static String castString(Object obj) {
        return CastUtil.castString(obj, "");
    }

    /**
     * @param obj          要转换的数据
     * @param defaultValue 默认值（将obj转为string，如果obj为null则返回defaultValue）
     * @return String 返回的数据
     * @Title: castString
     * @Description: Object转为String类型（提供默认值）（实体类需要重写toString方法）
     * @date 2019-05-05 02:48:40
     */
    public static String castString(Object obj, String defaultValue) {
        String result = defaultValue;
        if (obj != null) {
            result = String.valueOf(obj);
        }
        return result;
    }

    /**
     * @param obj 要转换的数据
     * @return double 返回的数据
     * @Title: castDouble
     * @Description: Object转为double类型，如果为null或者为空字或者不是数字类型则返回0
     * @date 2019-05-05 02:49:50
     */
    public static double castDouble(Object obj) {
        return CastUtil.castDouble(obj, 0);
    }

    /**
     * @param obj          要转换的数据
     * @param defaultValue 默认值（obj为null或者空字符串或者格式不对则返回defaultValue）
     * @return double 返回的数据
     * @Title: castDouble
     * @Description: Object转为double类型（提供默认值） ，如果为null或者为空字或者不是数字类型则返回defaultValue
     * @date 2019-05-05 02:50:25
     */
    public static double castDouble(Object obj, double defaultValue) {
        double value = defaultValue;  //声明结果,把默认值赋给结果
        if (obj != null) {   //判断是否为null
            String strValue = castString(obj);  //转换为String
            if (StringUtil.isNotNull(strValue)) {   //判断字符串是否为空（是否为空只能判断字符串，不能判断Object）
                try {
                    value = Double.parseDouble(strValue);  //不为空则把值赋给value
                } catch (NumberFormatException e) {
                    value = defaultValue;  //格式不对把默认值赋给value
                }

            }
        }
        return value;
    }

    /**
     * @param obj 要转换的数据
     * @return long 返回的数据
     * @Title: castLong
     * @Description: Object转为long型，如果为null或者为空字或者不是数字类型则返回0
     * @date 2019-05-05 02:51:26
     */
    public static long castLong(Object obj) {
        return CastUtil.castLong(obj, 0);
    }

    /**
     * @param obj          要转换的数据
     * @param defaultValue 默认值（如果为null或者为空字或者不是数字类型则返回defaultValue）
     * @return long 返回的数据
     * @Title: castLong
     * @Description: Object转为long型（提供默认数值），如果为null或者为空字或者不是数字类型则返回defaultValue
     * @date 2019-05-05 02:51:45
     */
    public static long castLong(Object obj, long defaultValue) {
        long value = defaultValue;  //声明结果,把默认值赋给结果
        if (obj != null) {   //判断是否为null
            String strValue = castString(obj);  //转换为String
            if (StringUtil.isNotNull(strValue)) {   //判断字符串是否为空
                try {
                    value = Long.parseLong(strValue);  //不为空则把值赋给value
                } catch (NumberFormatException e) {
                    value = defaultValue;  //格式不对把默认值赋给value
                }

            }
        }
        return value;
    }

    /**
     * @param obj 要转换的数据
     * @return int 返回的数据
     * @Title: castInt
     * @Description: Object转为int型（如果为null或者为空字或者不是数字类型则返回0）
     * @date 2019-05-05 02:52:31
     */
    public static int castInt(Object obj) {
        return CastUtil.castInt(obj, 0);
    }

    /**
     * @param obj          要转换的数据
     * @param defaultValue 默认值（如果为null或者为空字或者不是数字类型则返回defaultValue）
     * @return int 返回的数据
     * @Title: castInt
     * @Description: Object转为int型(提供默认值)
     * @date 2019-05-05 02:52:58
     */
    public static int castInt(Object obj, int defaultValue) {
        int value = defaultValue;  //声明结果,把默认值赋给结果
        if (obj != null) {   //判断是否为null
            String strValue = castString(obj);  //转换为String
            if (StringUtil.isNotNull(strValue)) {   //判断字符串是否为空
                try {
                    value = Integer.parseInt(strValue);  //不为空则把值赋给value
                } catch (NumberFormatException e) {
                    value = defaultValue;  //格式不对把默认值赋给value
                }

            }
        }
        return value;
    }

    /**
     * @param obj 要转换的数据
     * @return boolean 返回的数据
     * @Title: castBoolean
     * @Description: Object转为boolean型，不是true的返回为false
     * @date 2019-05-05 02:53:29
     */
    public static boolean castBoolean(Object obj) {
        return CastUtil.castBoolean(obj, false);
    }

    /**
     * @param obj          要转换的数据
     * @param defaultValue 默认值（obj为null时返回此默认值）
     * @return boolean 返回的数据
     * @Title: castBoolean
     * @Description: Object转为boolean型（提供默认值）
     * @date 2019-05-05 02:53:46
     */
    public static boolean castBoolean(Object obj, boolean defaultValue) {
        boolean value = defaultValue;
        if (obj != null) {  //为null则返回默认值
            value = Boolean.parseBoolean(castString(obj));  //底层会把字符串和true对比, 所以不用判断是否为空字符串
        }
        return value;
    }

    /**
     * obj转BigDecimal
     *
     * @param obj 要转换的数据
     * @return
     */
    public static BigDecimal castBigDecimal(Object obj) {
        return CastUtil.castBigDecimal(obj, null);
    }

    /**
     * obj转BigDecimal
     *
     * @param obj          要转换的数据
     * @param defaultValue 默认值（obj为null时返回此默认值）
     * @return
     */
    public static BigDecimal castBigDecimal(Object obj, BigDecimal defaultValue) {
        BigDecimal value = defaultValue;
        String strValue = castString(obj);  //转换为String
        if (StringUtil.isNotNull(strValue)) {  //为null则返回默认值
            value = new BigDecimal(strValue);  //底层会把字符串和true对比, 所以不用判断是否为空字符串
        }
        return value;
    }

    /**
     * @param obj 要转换的数据
     * @return Long 返回的数据
     * @Title: castLong
     * @Description: Object转为long型，如果为null或者为空字或者不是数字类型则返回0
     * @date 2019-05-05 02:51:26
     */
    public static Long castLongObj(Object obj) {
        return CastUtil.castLongObj(obj, null);
    }

    /**
     * @param obj          要转换的数据
     * @param defaultValue 默认值（如果为null或者为空字或者不是数字类型则返回defaultValue）
     * @return Long 返回的数据
     * @Title: castLong
     * @Description: Object转为long型（提供默认数值），如果为null或者为空字或者不是数字类型则返回defaultValue
     * @date 2019-05-05 02:51:45
     */
    public static Long castLongObj(Object obj, Long defaultValue) {
        Long value = defaultValue;  //声明结果,把默认值赋给结果
        String strValue = castString(obj);  //转换为String
        if (StringUtil.isNotNull(strValue)) {   //判断字符串是否为空
            try {
                value = Long.parseLong(strValue);  //不为空则把值赋给value
            } catch (NumberFormatException e) {
                value = defaultValue;  //格式不对把默认值赋给value
            }

        }
        return value;
    }


    /**
     * @param obj 要转换的数据
     * @return Short 返回的数据
     * @Title: castLong
     * @Description: Object转为long型，如果为null或者为空字或者不是数字类型则返回0
     * @date 2019-05-05 02:51:26
     */
    public static Short castShortObj(Object obj) {
        return CastUtil.castShortObj(obj, null);
    }

    /**
     * @param obj          要转换的数据
     * @param defaultValue 默认值（如果为null或者为空字或者不是数字类型则返回defaultValue）
     * @return Short 返回的数据
     * @Title: castLong
     * @Description: Object转为long型（提供默认数值），如果为null或者为空字或者不是数字类型则返回defaultValue
     * @date 2019-05-05 02:51:45
     */
    public static Short castShortObj(Object obj, Short defaultValue) {
        Short value = defaultValue;  //声明结果,把默认值赋给结果
        String strValue = castString(obj);  //转换为String
        if (StringUtil.isNotNull(strValue)) {   //判断字符串是否为空
            try {
                value = Short.parseShort(strValue);  //不为空则把值赋给value
            } catch (NumberFormatException e) {
                value = defaultValue;  //格式不对把默认值赋给value
            }

        }
        return value;
    }


    /**
     * @param obj 要转换的数据
     * @return Integer 返回的数据
     * @Title: castLong
     * @Description: Object转为long型，如果为null或者为空字或者不是数字类型则返回0
     * @date 2019-05-05 02:51:26
     */
    public static Integer castIntObj(Object obj) {
        return CastUtil.castIntObj(obj, null);
    }

    /**
     * @param obj          要转换的数据
     * @param defaultValue 默认值（如果为null或者为空字或者不是数字类型则返回defaultValue）
     * @return Integer 返回的数据
     * @Title: castLong
     * @Description: Object转为long型（提供默认数值），如果为null或者为空字或者不是数字类型则返回defaultValue
     * @date 2019-05-05 02:51:45
     */
    public static Integer castIntObj(Object obj, Integer defaultValue) {
        Integer value = defaultValue;  //声明结果,把默认值赋给结果
        String strValue = castString(obj);  //转换为String
        if (StringUtil.isNotNull(strValue)) {   //判断字符串是否为空
            try {
                value = Integer.parseInt(strValue);  //不为空则把值赋给value
            } catch (NumberFormatException e) {
                value = defaultValue;  //格式不对把默认值赋给value
            }

        }
        return value;
    }

    /**
     * @param obj 要转换的数据
     * @return Byte 返回的数据
     * @Title: castLong
     * @Description: Object转为long型，如果为null或者为空字或者不是数字类型则返回0
     * @date 2019-05-05 02:51:26
     */
    public static Byte castByteObj(Object obj) {
        return CastUtil.castByteObj(obj, null);
    }

    /**
     * @param obj          要转换的数据
     * @param defaultValue 默认值（如果为null或者为空字或者不是数字类型则返回defaultValue）
     * @return Byte 返回的数据
     * @Title: castLong
     * @Description: Object转为long型（提供默认数值），如果为null或者为空字或者不是数字类型则返回defaultValue
     * @date 2019-05-05 02:51:45
     */
    public static Byte castByteObj(Object obj, Byte defaultValue) {
        Byte value = defaultValue;  //声明结果,把默认值赋给结果
        String strValue = castString(obj);  //转换为String
        if (StringUtil.isNotNull(strValue)) {   //判断字符串是否为空
            try {
                value = Byte.parseByte(strValue);  //不为空则把值赋给value
            } catch (NumberFormatException e) {
                value = defaultValue;  //格式不对把默认值赋给value
            }

        }
        return value;
    }

    public static void main(String[] args) {
        List<String> l = new ArrayList<String>();
        l.add("001");
        System.out.println(CastUtil.castLong(l.get(0)) + 1);
    }
}